package com.xlhl.init.auth;

import cn.dev33.satoken.stp.StpInterface;
import com.alibaba.fastjson2.JSONObject;
import com.xlhl.init.manage.CacheManage;
import com.xlhl.init.model.entity.Account;
import com.xlhl.init.model.entity.Permission;
import com.xlhl.init.model.vo.PermissionVO;
import com.xlhl.init.service.AccountService;
import com.xlhl.init.service.PermissionService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 自定义权限加载接口实现类
 * <p>使用 Sa-Token 实现的鉴权</p>
 *
 * @author xlhl
 */
@Component
public class StpInterfaceImpl implements StpInterface {

    @Resource
    private CacheManage cacheManage;

    @Resource
    private AccountService accountService;

    @Resource
    private PermissionService permissionService;

    /**
     * 返回一个账号所拥有的权限码集合
     * 当 使用 Sa-Token 的账号权限校验时， 会调用此函数获取对应账号的权限来判断是否有权访问
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {

        Account account = accountService.lambdaQuery()
                .select(Account::getRoleId, Account::getId, Account::getId)
                .eq(Account::getId, loginId)
                .one();
        List<PermissionVO> permissions = permissionService.listByRoleId(account.getRoleId());

        return permissions.stream().map(PermissionVO::getCode).collect(Collectors.toList());

//      如果你想用缓存
//        String permissionPrefix = "Permission::";
//        return cacheManage.getList(permissionPrefix + loginId + loginType, () -> {
//            List<Permission> permissions = permissionService.listByRoleId(account.getRole());
//            List<String> permissionCodeList = permissions.stream().map(Permission::getCode).collect(Collectors.toList());
//
//            //  没有从缓存拿到数据，会通过这里的函数获取权限数据
//            return JSONArray.toJSONString(permissionCodeList);
//        }, String.class);
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     * 当 使用 Sa-Token 的角色权限校验时， 会调用此函数获取对应账号的权限来判断是否有权访问
     *
     * @deprecated 角色动态改变的化，这个没法用，除非系统的角色一开始就是固定且不变的
     */
    @Override
    @Deprecated
    public List<String> getRoleList(Object loginId, String loginType) {
        String rolePrefix = "Role::";
        return cacheManage.getList(rolePrefix + loginId + loginType, () -> {
            //  没有从缓存拿到数据，会通过这里的函数获取权限数据
            return JSONObject.toJSONString(new ArrayList<String>());
        }, String.class);
    }

}
